/*
 * Copyright 2011-2012 by The Regents of the University of California Licensed
 * under the Apache License, Version 2.0 (the "License"); you may not use this
 * file except in compliance with the License. you may obtain a copy of the
 * License from
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package edu.ucsd.db.bassarisk.schema.visitor;

import java.util.List;

import edu.ucsd.db.bassarisk.schema.DisjointChildrenNode;
import edu.ucsd.db.bassarisk.schema.SchemaNode;
import edu.ucsd.db.bassarisk.schema.SchemaPositionAttributeNode;
import edu.ucsd.db.bassarisk.schema.SchemaRootNode;
import edu.ucsd.db.bassarisk.schema.SchemaRunAttributeNode;
import edu.ucsd.db.bassarisk.schema.SchemaRunNode;

/**
 * Finds all SchemaRunNode objects that have the same tag.
 */
public class RunClassCollector implements
    SchemaNodeVisitor<Void, List<SchemaRunNode>> {
  private final String name;

  public RunClassCollector(final String name) {
    this.name = name;
  }

  @Override
  public Void visitDisjointChildrenNode(final DisjointChildrenNode node,
                                        final List<SchemaRunNode> arg) {
    for (SchemaNode child : node.getChildren()) {
      child.accept(this, arg);
    }
    return null;
  }

  @Override
  public Void visitSchema(final SchemaRootNode node, final List<SchemaRunNode> arg) {
    if (node.getName().equals(this.name)) {
      arg.add(node);
    }
    for (SchemaNode child : node.getChildren()) {
      child.accept(this, arg);
    }
    return null;
  }

  @Override
  public Void
      visitSchemaPositionAttributeNode(final SchemaPositionAttributeNode node,
                                       final List<SchemaRunNode> arg) {
    return null;
  }

  @Override
  public Void visitSchemaRunAttributeNode(final SchemaRunAttributeNode node,
                                          final List<SchemaRunNode> arg) {
    return null;
  }

  @Override
  public Void visitSchemaRunNode(final SchemaRunNode node,
                                 final List<SchemaRunNode> arg) {
    if (node.getName().equals(this.name)) {
      arg.add(node);
    }
    for (SchemaNode child : node.getChildren()) {
      child.accept(this, arg);
    }
    return null;
  }
}